---
sidebar_position: 5
---

# Item 物品类指南

`Item` 类用于处理服务器上的所有物品相关的操作。下面将描述 `Item` 类的主要功能和用法。

## `Item` 类概述 \{#item-class-overview}

位于 [cn.nukkit.item](https://github.com/MemoriesOfTime/Nukkit-MOT/blob/master/src/main/java/cn/nukkit/item/Item.java) 包中。

提供了大量的方法来创建和修改游戏中的物品，这些物品可以是方块、工具、食物等。

## 构造函数 \{#constructors}

`Item` 类提供了多个构造函数，允许从不同的参数创建物品实例。

### 示例代码： \{#example-code}
```java
// 导入Item类
import cn.nukkit.item.Item;

// 通过物品ID和数量创建物品
Item diamond = Item.get(Item.DIAMOND, 0, 1); // 创建1个钻石
// 给予玩家一个钻石
player.giveItem(diamond);
// 或者
player.getInventory().addItem(diamond);

// 通过命名空间创建物品（推荐！）
Item apple = Item.fromString("minecraft:apple");
```

### 代码解释： \{#code-explanation}

:::warning

获取物品一定要使用 `Item.get()` 或 `Item.fromString()` 方法，而不是实例化物品对象 `new ItemDiamond(id, meta, count)`！

:::

- `Item.DIAMOND`: 这是钻石的物品ID，每种物品都有一个唯一的ID。
- `0`: 这是物品的变种号，对于大多数物品来说，这个值为0。
- `1`: 这代表物品的数量。

## 主要方法 \{#main-methods}

以下是 `Item` 类中一些常用方法的介绍和示例。

### `getId()` \{#get-id}
返回物品的ID。
```java
int id = diamond.getId(); // 获取钻石的ID
// 输出：264
```

### `getNamespaceId()` \{#get-namespace-id}
返回物品的命名空间。
```java
String namespace = diamond.getNamespaceId(); // 获取钻石的命名空间
// 输出：minecraft:diamond
```

### `getCount()` \{#get-count}
返回物品的数量。
```java
int count = diamond.getCount(); // 获取钻石的数量
// 输出：1
```

### `getName()` \{#get-name}
返回物品的名称。
```java
String name = diamond.getName(); // 获取钻石的名称
// 输出：Diamond
```

### `getEnchantmentLevel(int id)` \{#get-enchantment-level}
获取物品的附魔等级。
你可以在 [cn.nukkit.item.enchantment.Enchantment](https://github.com/MemoriesOfTime/Nukkit-MOT/blob/master/src/main/java/cn/nukkit/item/enchantment/Enchantment.java) 找到相关附魔ID
```java
int level = diamond.getEnchantmentLevel(Enchantment.ID_DAMAGE_ALL); // 获取钻石的锋利等级 若没有附魔 则返回 0
// 输出：0
```

## 处理物品的属性 \{#handling-item-properties}

物品的属性可以通过各种setter和getter方法来管理。

### 设置物品数量 \{#set-number-of-items}
```java
diamond.setCount(3); // 将钻石的数量设置为3
```

### 示例代码 \{#example-code-properties}

一、设置物品基本属性

```java
Item diamond = Item.get(Item.DIAMOND, 0, 1);
diamond.setLore("第一行", "第二行"); // 你可以继续增加行数
diamond.setCustomName("物品的自定义名称"); // 如果不希望文本倾斜 可在文本最前面添加 "§r" 来重置格式
diamond.addEnchantment(Enchantment.get(Enchantment.ID_DAMAGE_ALL).setLevel(5), Enchantment.get(Enchantment.ID_PROTECTION_ALL).setLevel(4)); // 为物品添加锋利5和保护4附魔
```

二、物品无限耐久

```java
// 通过 nbt 来实现
CompoundTag tag = diamond.hasCompoundTag() ? diamond.getNamedTag() : new CompoundTag();
tag.putByte("Unbreakable", 1);

// 修改 nbt 后需 setNamedTag 方可生效
diamond.setNamedTag(tag);
```

三、物品锁的模式

Nukkit-MOT 提供了 `Item.ItemLockMode` 类，开发者可以使用 `setItemLockMode(ItemLockMode lockMode)` 来设置物品的锁模式。

- `Item.ItemLockMode.LOCK_NONE`

移除物品锁

- `Item.ItemLockMode.LOCK_IN_INVENTORY`

物品表面使用 ![lock in inventory](https://minecraft.wiki/images/Item_lock_yellow.png) 纹理。

阻止该物品被从玩家的物品栏移除、丢弃或用于合成。

- `Item.ItemLockMode.LOCK_IN_SLOT`

物品表面使用 ![lock in slot](https://minecraft.wiki/images/Item_lock_red.png) 纹理

阻止该物品被从玩家物品栏的该槽位移动、移除、丢弃或用于合成。

:::note

自 1.16.100 (协议版本 419) 开始支持

:::

```java
diamond.setItemLockMode(Item.ItemLockMode.LOCK_IN_INVENTORY);
```